<?php
/**
 * Created by PhpStorm.
 * User: skytop
 * Date: 2017/1/12
 * Time: 19:01
 */
header("Content-type:text/html;charset=utf-8;");
//float改变数据类型
$totalqty=0;
$totalamount=(float)$totalqty;
var_dump($totalamount);
var_dump($totalqty);

//可变变量
$tireqty=null; //不声明和赋值会报错,坑爹的IDE
$varname='tireqty';
$$varname=5;

echo $varname."-----".$tireqty;
echo "<hr/>";
echo "$varname-----${$varname}"; //这就是原理,省略了大括号就变为"可变变量"

//常量
#define('TIREPRICE',100);define('TIREPRICE',90); //因为常量已被设置,所以不能再被设置,并且常量只能保存标量
#echo TIREPRICE;
echo "<hr/>";

//复合赋值操作符
function composite(){
    $a=1;$a+=5;echo $a."<br/>";
    $b=2;$b-=5;echo $b."<br/>";
    $c="www";$c.=$b;echo $c;
    echo "<hr/>";
}
composite();

//递加递减运算符
$a=4;$b=7;
echo ++$a."---".$a++; //两个都为5,因为后者是在$a变为5后进行的
echo "<br/>".$a++."---".++$a."<br/>";
echo $c=$b++; //这就是先赋值后运算

//引用操作符
function yinyong(){
    $a=5;
    $b=&$a;

    echo "<hr/>";
    echo $a."-----".$b;
    unset($a); //销毁$a,undefined变量
    echo "<br/>".$b;
}
yinyong();

//比较操作符 [<>]==[!=]

//逻辑操作符 ! && || and or xor

//位操作符

//三元操作符 ? :

//错误抑制符 @

//执行操作符 ` `,19章详细介绍
/*$out= `dir c:`;
echo "<pre>$out</pre>";*/

//数组操作符 ['key'=>'value'].[],=>(数组成员访问符号)
//数组运算符
//1.联合
function union(){
    $a=[1,2,3,4,5];$b=['a','b','c','d','e','f'];
    return $a+$b;
}
var_dump( union()); //+运算符是把右边的数组元素附加到左边的数组元素后面,而重复的键名的值不会被覆盖

//2.等价于恒等
function equal(){
    $a=[1,2,3,4,5];$b=[1,3,4,2,5];
    var_dump($a==$b);var_dump($a===$b);
    $c=['a'=>1,'b'=>2,'c'=>3];$d=['c'=>3,'a'=>1,'b'=>2];$e=['c'=>3,'a'=>1,'b'=>2];
    var_dump($c==$d);var_dump($c===$d);var_dump($d===$e); //等于为键值对相等,恒等为键值对并且顺序相等
}
equal();

//3.非等于非恒等

function unequal(){
    echo "<br/>测试非等非恒等数组操作符";
    $one = [1, 2, 3, 4, 6];
    $two = ['a', 'b', 'c'];
    var_dump($one !== $two);
}
unequal();

//注意:标量和数组无法比较

//5.类型操作符 instanceof 允许检查一个对象是否是特定类的实例
class sampleClass{};
$myObj=new sampleClass();
if($myObj instanceof sampleClass)
    echo "myObject is an instance of sampleClass";

//可变函数
#用于测试一个函数类型.最常见的是gettype() settype()
function varfunc(){
    $a=[1,2,3];echo "<hr/>".gettype($a);
    var_dump(@settype($a,'string'));echo gettype($a); //若不能转换则还会报错,但是settype不会返回false
}
varfunc();

#is_array()
#is_double(),is_float(),is_real()   效果相同
#is_int(),is_long(),is_integer()    效果相同
#is_string()
#is_bool()
#is_object()
#is_resource()
#is_null()
#is_scalar()    是否为标量
#is_numberic()  是否为数字或数字字符串
#is_callable()  是否为有效的函数名称

//测试变量状态
#isset() unset() empty()

//变量的重解释 左侧开始,左侧若非要找的类型则返回0
echo "<hr/>".intval('23sdf3sd')."<br/>";echo floatval("sds1.2");//超过int范围则显示int范围最大值

//根据条件进行决策
#控制结构是一个程序语言中用来控制一个程序或脚本执行流程的结构,可以将它们分类为条件(或者分支)结构和重复结构(或循环结构)

##1.if语句

#代码块:多个语句放在一起

##2.else语句

##3.elseif 写成else if也可

##4.switch语句

#比较不同条件:根据实际情况来确定

//根据迭代实现重复动作
##1.while循环

##2.for和foreach循环 | foreach专门用于数组
/* for(expression1;condition;expression2)
 *      expression3;
 *
 * expression1(表达式1)在开始时只执行一次.              通常在这里设置计数器的初始值(变量初始化)
 * 在每一次循环开始之前,condition(条件)表达式将被测试.    如果条件表达式返回值为false,循环将结束.(条件)
 * expression2(表达式2)在每一次循环结束时执行.          通常,可以在这里调整计数器的值(取值范围)
 * expression3(表达式3)在每一次循环中执行一次.          通常,这个表达式是一个包含大量循环代码的代码块(循环体)
 * */

##3.do...while循环
/*do
 *  expression;
 * while(condition);
 * */
//do...while循环与while循环不同于它将测试条件放在整个语句块的最后,这就意味着do...while循环中的语句或语句块至少执行一次



//从控制结构或脚本中跳出
//如果希望停止一段代码的执行,根据所需要达到的效果不同,可以有3种方法来实现

#1.如果希望停止一个循环,可以使用在介绍switch循环时提到的break语句.
##  如果循环中使用了break语句,脚本就会从循环体后面的第一条语句处开始执行.

#2.如果希望跳到下一次循环,就可以使用continue语句

#3.若果希望结束整个php脚本的执行,可以使用exit语句.当执行错误检查时,这个语句非常有用.


//使用可替换的控制结构语法
/*
 * 对于我们已经介绍过得所有控制语句,还有一个可替换的语法形式.
 */
/*if($totalqty==0){
    echo 'You did not order anything on the previous page!<br/>';
    exit;
}
//替换为:

if($totalqty==0):
    echo 'You did not order anything on the previous page!<br/>';
    exit;
endif;*/
//可用于:endif,endswitch,endwhile,endfor,endforeach

//使用declare
#php另一个控制结构是declare结构,它并没有像其它结构一样在日常编程中经常使用,格式如下:
/*declare(directive)
{
    //block
}*/

#这种结构是用来设置代码块的执行指令---也就是,关于后续代码如何运行的规则.
#目前,只实现了一个执行指令:ticks.它可以通过插入指令ticks=n来设置.它允许代码块内部每隔n行代码运行特定的函数,这对于性能测试和调试来说是非常有用的